package it.unicam.ids.pvm.distributore;

/**
 * La classe rappresenta una casella per l'esposizione di 
 * un prodotto. Gli attributi sono:
 * etichetta, codice univoco per ogni casella;
 * lato, lato del distributore su cui risiede la casella;
 * prodotto, prodotto contenuto nella casella;
 * quantita, quantità di prodotto rimanente;
 * maxQuantita, quantità massima contenibile;
 * spirale, spirale di erogazione del prodotto.
 * @author Luca Iachini, Valerio Iachini, Alessandro Cardenà
 *
 */
public class Casella {
    private String etichetta;
    private Lato lato;
    private Prodotto prodotto;
    private int quantita;
    public final static int MAX_QUANTITA = 10;
    private Spirale spirale;

    /**
     * Costruttore della classe.
     * Inizializza l'etichetta, il lato e imposta la spirale.
     * @param etichetta.
     * @param lato.
     */
    
    public Casella(String etichetta, Lato lato) {
            setEtichetta(etichetta);
            setLato(lato);
            spirale=new Spirale(this);
    }

    /**
     * Costruttore della classe.
     * Inizializza l'etichetta, il lato, il prodotto contenuto
     * e la quantità di tale prodotto.
     * @param etichetta.
     * @param lato.
     * @param prodotto.
     * @param quantita.
     * @throws Exception.
     */
    
    public Casella(String etichetta,Lato lato, Prodotto prodotto, int quantita) throws Exception {
            this(etichetta, lato);
            setProdotto(prodotto);
            setQuantita(quantita);
    }

    /**
     * Il metodo restituisce il prodotto contenuto 
     * nella casella.
     * @return prodotto.
     */
    
    public Prodotto getProdotto() {
            return prodotto;
    }

    /**
     * Il metodo imposta il prodotto contenuto.
     * @param prodotto
     */
    
    public void setProdotto(Prodotto prodotto) {
            this.prodotto = prodotto;
    }

    /**
     * Il metodo imposta la quantità del prodotto contenuto.
     * @param quantita.
     * @throws Exception.
     */
    
    public void setQuantita(int quantita) throws Exception {
            if (quantita >= 0 && quantita <= MAX_QUANTITA)
                    this.quantita = quantita;
            else
                    throw new Exception();
    }

    /**
     * Il metodo restituisce la spirale di erogazione 
     * associata alla casella.
     * @return spirale.
     */
    
    public Spirale getSpirale(){
    	return spirale;
    }
    
    /**
     * Il metodo restituisce la quantità del 
     * prodotto contenuto.
     * @return
     */

    public int getQuantita() {
            return quantita;
    }
    
    /**
     * Il metodo imposta a null l'attributo prodotto.
     */

    public void rimuoviProdotto() {
            prodotto = null;
    }

   
     /**
     * Il metodo imposta il valore dell'etichetta 
     * associata alla casella.
     * @param etichetta.
     */
    
    public void setEtichetta(String etichetta) {
            this.etichetta = etichetta;
    }

    /**
     * Il metodo restituisce il valore dell'etichetta 
     * associata alla casella.
     * @return etichetta.
     */
    
    public String getEtichetta() {
            return etichetta;
    }
    
    /**
     * Il metodo imposta il lato in cui 
     * la casella è posta.
     * @param lato.
     */
    
    public void setLato(Lato lato) {
            this.lato = lato;
    }
    
    /**
     * Il metodo restituisce il lato 
     * in cui la casella è posta.
     * @return
     */

    public Lato getLato() {
            return lato;
    }
    
}